package com.example.service;

import com.example.dto.AnnouncementRequest;
import com.example.dto.ApiResponse;
import com.example.entity.Announcement;
import org.springframework.http.ResponseEntity;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

public interface AnnouncementService {

    /**
     * 获取所有已发布的公告
     * @return 已发布的公告列表
     */
    List<Announcement> getAllPublishedAnnouncements();

    /**
     * 分页获取已发布的公告
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @return 分页结果
     */
    Map<String, Object> getPublishedAnnouncementsWithPage(int page, int size);


    /**
     * 分页获取所有公告
     * @param page 页码
     * @param size 每页大小
     * @param status 状态筛选
     * @return 分页结果
     */
    Map<String, Object> getAllAnnouncementsWithPage(int page, int size, Integer status);



    /**
     * 获取所有公告（包括未发布的）
     * @return 所有公告列表
     */
    List<Announcement> getAllAnnouncements();

    /**
     * 根据ID获取公告
     * @param id 公告ID
     * @return 公告对象
     */
    Announcement getAnnouncementById(Long id);

    /**
     * 创建新公告
     * @param request 公告请求对象
     * @return API响应
     */
    ApiResponse<?> createAnnouncement(AnnouncementRequest request);

    /**
     * 创建新公告并上传文件
     * @param request 公告请求对象
     * @param files 文件列表
     * @return API响应
     */
    ApiResponse<?> createAnnouncementWithFiles(AnnouncementRequest request, List<MultipartFile> files);

    /**
     * 获取公告及其相关文件
     * @param id 公告ID
     * @return API响应
     */
    ApiResponse<?> getAnnouncementWithFiles(Long id);

    /**
     * 更新公告
     * @param id 公告ID
     * @param request 公告请求对象
     * @return API响应
     */
    ApiResponse<?> updateAnnouncement(Long id, AnnouncementRequest request);

    /**
     * 删除公告
     * @param id 公告ID
     * @return API响应
     */
    ApiResponse<?> deleteAnnouncement(Long id);

    /**
     * 发布或取消发布公告
     * @param id 公告ID
     * @param isPublished 是否发布
     * @return API响应
     */
    ApiResponse<?> togglePublishStatus(Long id, Boolean isPublished);

    /**
     * 下载文件
     * @param fileId 文件ID
     * @return 文件响应
     */
    ResponseEntity<Resource> downloadFile(Long fileId);
    
    /**
     * 获取文件的访问URL
     * @param fileId 文件ID
     * @return 文件的访问URL
     */
    String getFileUrl(Long fileId);
    
    /**
     * 直接查看文件（在浏览器中打开）
     * @param fileId 文件ID
     * @return 文件资源响应
     */
    ResponseEntity<Resource> viewFile(Long fileId);
}